#include "BloqueMemoria.h"

BloqueMemoria::BloqueMemoria(TipoMemoria tipoMemoria, int tamanio, int id, void* accesoMemoria){
	this->tipoMemoria = tipoMemoria;
	this->tamanio = tamanio;
	this->id = id;
	this->bloque = (char*)accesoMemoria;
	this->escribo();

}

void BloqueMemoria::getAccesoDato(void** accesoDato){
	*accesoDato = (void*) this->bloque;	
}

void BloqueMemoria::addComponente(ComponenteAlmacenamiento *componente){
	if(componente->getTipoMemoria()!=this->tipoMemoria)
		throw new CompuestoException(CompuestoException::add);		
	if(this->getTamanioLibre() < componente->getTamanio())
		throw new CompuestoException(CompuestoException::add);		
	Compuesto::addComponente(componente);
}

void BloqueMemoria::leer(char **datoLeido, TipoSerializacion modo){	

	if(this->bloque==NULL)
		throw new NullPointerException();
	*datoLeido = (char*) malloc(this->tamanio);
	if(*datoLeido==NULL)
		throw new MemoryStorageException(StorageException::lectura);
	char* destino;
	destino = (char*) memmove(*datoLeido,this->bloque,this->tamanio);
	if(*datoLeido!=destino)
		throw new MemoryStorageException(StorageException::lectura);
}

void BloqueMemoria::escribir(void *accesoDisco, TipoSerializacion modo){
}

void BloqueMemoria::escribir(TipoSerializacion modo){
	this->escribo();
	int i;
	
	try{
		for(i=0; i<this->getCantidadComponentes(); i++){
	
			this->getComponenteAt(i)->escribir(modo);
		}
	}
	catch(MemoryStorageException e){
		throw new MemoryStorageException(StorageException::escritura);
	}
}

void BloqueMemoria::escribir(void *accesoDisco, Dato *dato, TipoSerializacion modo){	
}

void BloqueMemoria::borrar(){
	this->bloque = NULL;
}

void BloqueMemoria::escribo(){
	memset(bloque,255,this->tamanio);	// inicializo bloque en FFFFFF...
}

BloqueMemoria::~BloqueMemoria(){
	this->borrar();
}
